/**
 * TDS PEC 4
 * Grupo 3H2M 
 *
 * El paquete <code>edu.uoc.tds.pec4.conexion</code> agrupa todas las
 * interfaces, clases y elementos de la GUI para el control del subsistema de Conexion
 */
package edu.uoc.tds.pec4.conexion;


import edu.uoc.tds.pec4.rmi.GestorConexionInterface;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.common.util.*;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorConexionException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

/**
 * La clase <code>Login</code> representa la interfaz de
 * usuario general del programa poder acceder a la herramienta.<br />
 *
 * Interficie de usuario general de acceso a la herramienta.
 *
 * @author	Jaime Marcos de la Calle
 * @version	28/11/2011
 */
public class Login extends javax.swing.JFrame {

    //variables interfaz gráfica
    private javax.swing.JButton jButtonEntrar;
    private javax.swing.JButton jButtonRecordar;
    private javax.swing.JButton jButtonSalir;
    private javax.swing.JLabel jLabelLogo;
    private javax.swing.JLabel jLabelPassword;
    private javax.swing.JLabel jLabelUsuario;
    private javax.swing.JPanel jPanelDatosAcceso;
    private javax.swing.JPasswordField jPasswordField;
    private javax.swing.JTextField jTextFieldUsuario;
    
    /** objRemoto Es el objeto empleado como interfaz en la comunicación RMI */
    private GestorConexionInterface objRemoto = null;
    private GestorDiccionarioInterface objRemotoDic=null;
    private boolean clientConnected = false;
    private UsuarioDTO usuario = null;

    /** Creates new form Login */
    public Login() {
        //Cargamos el fichero de mensajes
        cargarFicheroMensajes();
        //Se obliga a trabajar con el interfaz gráfico WindowsLoofAndFeel
        try    {
            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }catch (Exception e){
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.interfaz") + "\n" + e.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
        }
        IniciaObjRemoto();
        initComponents();
        
        //Centramos la ventana en la pantalla
        UtilidadesGUI.centrarVentana(this);
    }
    
    /**
     * Carga el fichero de mensajes i18n
     */
    private void cargarFicheroMensajes() {
        /**
         * Comprobar que existe fichero mensajes
         */
        if (!TDSLanguageUtils.setDefaultLanguage("i18n/messages")) {
            System.out.println("No se ha cargado el fichero de mensajes 'i18n/messages*.properties'. La aplicación no se puede iniciar");
            System.exit(-1);
        }
    }
    
    /**
     * Inicia los objetos remotos GestorConexionInterfaca y GestorDiccionarioInterface
     * 
     * @return boolean, true si no ha habido errores, false en caso contrario
     */
    private boolean IniciaObjRemoto(){
        boolean estado=false;        
            try{
            objRemoto = (GestorConexionInterface) Naming.lookup("GestorInterface");
            objRemotoDic = (GestorDiccionarioInterface) Naming.lookup("GestorDiccionario");
            clientConnected = true;
            estado=true;
            }  catch (RemoteException eRe) {
                objRemoto = null;
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.login.conn") + "\n" + eRe.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            } catch (NotBoundException eNbe) {
                objRemoto = null;
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.login.conn") + "\n" + eNbe.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            } catch (Exception eE) {
                objRemoto = null;
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.login.conn") + "\n" + eE.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            }
        return estado;
    }
    
     /**
     * Este método inicializa el interfaz gráfico de la clase
     *
     */
    private void initComponents() {

        jLabelLogo = new javax.swing.JLabel();
        jPanelDatosAcceso = new javax.swing.JPanel();
        jLabelUsuario = new javax.swing.JLabel();
        jLabelPassword = new javax.swing.JLabel();
        jTextFieldUsuario = new javax.swing.JTextField();
        jPasswordField = new javax.swing.JPasswordField();
        jButtonEntrar = new javax.swing.JButton();
        jButtonSalir = new javax.swing.JButton();
        jButtonRecordar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle(TDSLanguageUtils.getMessage("login.titulo"));

        jLabelLogo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/img.jpg"))); 

        jPanelDatosAcceso.setBorder(javax.swing.BorderFactory.createTitledBorder(TDSLanguageUtils.getMessage("login.datos.acceso")));

        jLabelUsuario.setText(TDSLanguageUtils.getMessage("login.label.usuario"));

        jLabelPassword.setText(TDSLanguageUtils.getMessage("login.label.password"));
 

        javax.swing.GroupLayout jPanelDatosAccesoLayout = new javax.swing.GroupLayout(jPanelDatosAcceso);
        jPanelDatosAcceso.setLayout(jPanelDatosAccesoLayout);
        jPanelDatosAccesoLayout.setHorizontalGroup(
            jPanelDatosAccesoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelDatosAccesoLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelUsuario)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextFieldUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(31, 31, 31)
                .addComponent(jLabelPassword)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(30, Short.MAX_VALUE))
        );
        jPanelDatosAccesoLayout.setVerticalGroup(
            jPanelDatosAccesoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanelDatosAccesoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanelDatosAccesoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelUsuario)
                    .addComponent(jTextFieldUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelPassword))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jButtonEntrar.setText(TDSLanguageUtils.getMessage("login.boton.entrar"));
        jButtonEntrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonEntrarActionPerformed(evt);
            }
        });

        jButtonSalir.setText(TDSLanguageUtils.getMessage("login.boton.cancelar"));
        jButtonSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonSalirActionPerformed(evt);
            }
        });

        jButtonRecordar.setText(TDSLanguageUtils.getMessage("login.boton.olvido"));
        jButtonRecordar.setEnabled(false);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabelLogo)
                        .addGap(108, 108, 108))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanelDatosAcceso, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addContainerGap())))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(82, 82, 82)
                .addComponent(jButtonEntrar, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButtonSalir)
                .addGap(53, 53, 53)
                .addComponent(jButtonRecordar, javax.swing.GroupLayout.DEFAULT_SIZE, 147, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanelDatosAcceso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonEntrar, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonRecordar, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButtonSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }

    /**
     * Método para salir del sistema.
     * 
     * @param evt Acción al pulsar el boton de Cancelar
     */
    private void jButtonSalirActionPerformed(java.awt.event.ActionEvent evt) {
        dispose();
    }
    
    /**
     * Método para entrar al sistema. Lanza la verificación de usuario y password
     * 
     * @param evt Acción al pulsar el boton de Entrar
     */
    private void jButtonEntrarActionPerformed(java.awt.event.ActionEvent evt) {
        if (IniciaObjRemoto()){
            UsuarioDTO usu = new UsuarioDTO();
            usu = null;
            try {
                String string = jTextFieldUsuario.getText();
                usu=objRemoto.consultarUsuario(string);
            } catch (RemoteException ex) {
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.login.conn") + "\n" + ex.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            } catch (GestorConexionException ex) {
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("cliente.error.login.conn") + "\n" + ex.getMessage(),
                        TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            }
            if (usu!=null ){
                if(validarUsuario(usu)){
                	usuario.setIdUsuario(jTextFieldUsuario.getText().trim());
                        dispose();
                        Cliente cliente = new Cliente(usuario,objRemoto,objRemotoDic);
                        cliente.setVisible(true);
                }
            }else{
                JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.login.usuario"),
                    TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
/**
     * Valida el password del usuario del parametro con el introducido por pantalla
     * 
     * @param usuario usuario para validar el password
     * @return boolean si es correcto true si el password es incorrecto false
     */
    public boolean validarUsuario (UsuarioDTO usuario){
        String passwf = new String(jPasswordField.getPassword());
        if(!usuario.getPassword().trim().equals(passwf.trim())){
                JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.login.password"),
                    TDSLanguageUtils.getMessage("cliente.error.login"), JOptionPane.ERROR_MESSAGE);
            return false;
        }else{
            this.usuario=usuario;
            return true;
        }
    }
       
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Login().setVisible(true);
            }
        });
    }
}
